home *** CD-ROM | disk | FTP | other *** search
- OPT MODULE
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////////////////////////// MODULE ... /////
- ->/////////////////////////////////////////////////////////////////////////////
- MODULE 'exec/lists' , 'exec/nodes' , 'exec/execbase' , 'exec/libraries'
- MODULE 'dos/dos' , 'dos/datetime' , 'dos/rdargs'
- MODULE 'tools/minconstructors' , 'tools/file'
-
- MODULE '*SystemFiles'
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////////////// RAISE ... IF ... = ... /////
- ->/////////////////////////////////////////////////////////////////////////////
- RAISE "MEM" IF String() = NIL ,
- "MEM" IF AllocDosObject() = NIL ,
- "IO" IF Open() = NIL ,
- "IO" IF Fputs() = -1
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->/////////////////////////////////////////////////////// CONST ... = ... /////
- ->/////////////////////////////////////////////////////////////////////////////
- ENUM NAME , OPENED , LASTUSED , VERSION , CHNG , LASTCHANGE , NUMBERFIELDS
-
- ENUM ARG_FD , ARG_NC
- ENUM ARG_NAME , ARG_OC , ARG_LU , ARG_VER , ARG_REV , ARG_CHNG , ARG_LC , ARG_LIB , ARG_DEV ,
- NUMBER_ARGS
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////////////////////////// OBJECT ... /////
- ->/////////////////////////////////////////////////////////////////////////////
- EXPORT OBJECT trace
- filename : PTR TO CHAR
- first_date : PTR TO CHAR
- num_checks : LONG
- libraries : mlh
- devices : mlh
- ENDOBJECT
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->/////////////////////////////////////////////////////////// PROC create /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC create( filename = NIL ) OF trace
- self.filename := ( IF filename THEN filename ELSE 'PROGDIR:MSFU.trace' )
- self.first_date := current_date()
- newminlist( self.libraries )
- newminlist( self.devices )
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->///////////////////////////////////////////////////////////// PROC load /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC load() OF trace HANDLE
-
- DEF mem = NIL , len
- DEF lines : PTR TO LONG , numlines , i = -1 , line[ 200 ] : STRING
- DEF rd = NIL : PTR TO rdargs , args = NIL : PTR TO LONG
- DEF sf : PTR TO sysfile
-
- mem , len := readfile( self.filename )
- lines := stringsinfile( mem , len , numlines := countstrings( mem , len ) )
-
- rd := AllocDosObject( DOS_RDARGS , NIL )
- NEW args[ NUMBER_ARGS ]
- FOR i := 0 TO ( numlines - 1 )
- args[ ARG_LIB ] := FALSE
- args[ ARG_DEV ] := FALSE
- rd.source.buffer := StrAdd( StrCopy( line , lines[ i ] ) , '\n' )
- rd.source.length := EstrLen( line )
- rd.source.curchr := 0
- rd.dalist := NIL
- rd.buffer := NIL
- rd.bufsiz := 0
- IF i
- ReadArgs( 'NAME,OC/N,LU,VER/N,REV/N,CHNG/N,LC,LIB/S,DEV/S' , args , rd )
- NEW sf
- sf.name := StrCopy( String( StrLen( args[ ARG_NAME ] ) ) , args[ ARG_NAME ] )
- sf.open_count := Long( args[ ARG_OC ] )
- sf.last_used := StrCopy( String( StrLen( args[ ARG_LU ] ) ) , args[ ARG_LU ] )
- sf.vernum := Long( args[ ARG_VER ] )
- sf.revnum := Long( args[ ARG_REV ] )
- sf.changed := Long( args[ ARG_CHNG ] )
- sf.last_change := StrCopy( String( StrLen( args[ ARG_LC ] ) ) , args[ ARG_LC ] )
- AddTail( IF args[ ARG_LIB ] THEN self.libraries ELSE self.devices , sf )
- ELSE
- ReadArgs( 'FD,NC/N' , args , rd )
- self.first_date := StrCopy( String( StrLen( args[ ARG_FD ] ) ) , args[ ARG_FD ] )
- self.num_checks := Long( args[ ARG_NC ] )
- ENDIF
- FreeArgs( rd )
- ENDFOR
-
- EXCEPT DO
- IF ( i >= 0 ) AND ( i <= ( numlines - 1 ) ) THEN FreeArgs( rd )
- END args[ NUMBER_ARGS ]
- IF rd THEN FreeDosObject( DOS_RDARGS , rd )
- IF mem THEN freefile( mem )
-
- IF exception = "MEM"
- ReThrow()
- ELSEIF ( exception = "OPEN" ) OR ( exception = "IN" )
- PrintFault( IoErr() , 'Can''t open trace ' )
- ENDIF
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->///////////////////////////////////////////////////////////// PROC save /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC save() OF trace HANDLE
-
- DEF file = NIL , sl[ 100 ] : STRING
-
- file := Open( self.filename , NEWFILE )
- Fputs( file , StringF( sl , '\s \d\n' , self.first_date , self.num_checks ) )
-
- save_sysfiles( file , self.libraries , 'LIB' )
- save_sysfiles( file , self.devices , 'DEV' )
-
- EXCEPT DO
- PrintFault( IoErr() , 'Can''t save trace ' )
- IF file THEN Close( file )
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->/////////////////////////////////////////////////////////// PROC update /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC update( libs , devs ) OF trace
-
- DEF list : mlh , eb : execbase
-
- self.num_checks := self.num_checks + 1
- eb := execbase
-
- IF libs
- current_sysfiles( list , eb.liblist )
- mix_sysfiles( list , self.libraries )
- ENDIF
-
- IF devs
- current_sysfiles( list , eb.devicelist )
- mix_sysfiles( list , self.devices )
- ENDIF
-
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->///////////////////////////////////////////////////////////// PROC sort /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC sort() OF trace
- sort_sysfiles( self.libraries )
- sort_sysfiles( self.devices )
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////////////////////////// PROC print /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC print() OF trace
- PrintF( '\n\d check were done since \s.\n' , self.num_checks , self.first_date )
- print_sysfiles( self.libraries , 'Library name' , self.num_checks )
- print_sysfiles( self.devices , 'Device name' , self.num_checks )
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->///////////////////////////////////////////////////// PROC current_date /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC current_date()
-
- DEF dt : datetime
- DEF str[ 30 ] : ARRAY
-
- DateStamp( dt.stamp )
- dt.format := FORMAT_DOS
- dt.flags := 0
- dt.strday := NIL
- dt.strdate := str
- dt.strtime := NIL
- DateToStr( dt )
-
- ENDPROC StrCopy( String( StrLen( str ) ) , str )
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->///////////////////////////////////////////////// PROC current_sysfiles /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC current_sysfiles( list : PTR TO mlh , syslist : PTR TO mlh ) HANDLE
-
- DEF sf : PTR TO lib , f : PTR TO sysfile -> OBJECT lib = OBJECT dd (see exec/devices)
-
- newminlist( list )
- sf := syslist.head
-
- Forbid()
- Disable()
-
- WHILE sf.ln.succ
- NEW f
- f.name := StrCopy( String( StrLen( sf.ln.name ) ) , sf.ln.name )
- f.open_count := sf.opencnt
- f.vernum := sf.version
- f.revnum := sf.revision
- AddTail( list , f )
- sf := sf.ln.succ
- ENDWHILE
-
- EXCEPT DO
-
- Enable()
- Permit()
-
- ReThrow()
-
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->///////////////////////////////////////////////////// PROC mix_sysfiles /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC mix_sysfiles( list1 : PTR TO mlh , list2 : PTR TO mlh )
-
- DEF sf1 : PTR TO sysfile , sf2: PTR TO sysfile
- DEF bool = FALSE
-
- WHILE ( ( sf1 := list1.head ) BUT sf1.succ )
-
- Remove( sf1 )
-
- sf2 := list2.head
- WHILE sf2.succ
- EXIT ( bool := StrCmp( sf1.name , sf2.name ) )
- sf2 := sf2.succ
- ENDWHILE
-
- IF bool
-
- sf2.open_count := sf2.open_count + sf1.open_count
- DisposeLink( sf2.last_used )
- sf2.last_used := current_date()
-
- IF ( sf1.vernum <> sf2.vernum ) OR ( sf1.revnum <> sf2.revnum )
- sf2.vernum := sf1.vernum
- sf2.revnum := sf1.revnum
- sf2.changed := sf2.changed + 1
- DisposeLink( sf2.last_change )
- sf2.last_change := current_date()
- ENDIF
-
- DisposeLink( sf1.name )
- END sf1
-
- ELSE
-
- sf1.last_used := current_date()
- sf1.last_change := current_date()
- AddTail( list2 , sf1 )
-
- ENDIF
-
- ENDWHILE
-
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////////////////// PROC sort_sysfiles /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC sort_sysfiles( list : PTR TO mlh )
-
- DEF tlist : mlh , sf : PTR TO sysfile
- DEF max , msf : PTR TO sysfile
-
- newminlist( tlist )
-
- WHILE ( ( sf := list.head ) BUT sf.succ )
-
- max := -1
- WHILE sf.succ
- IF sf.open_count > max
- max := sf.open_count
- msf := sf
- ENDIF
- sf := sf.succ
- ENDWHILE
-
- Remove( msf )
- AddTail( tlist , msf )
-
- ENDWHILE
-
- WHILE ( ( sf := tlist.head ) BUT sf.succ )
- Remove( sf )
- AddTail( list , sf )
- ENDWHILE
-
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->/////////////////////////////////////////////////// PROC print_sysfiles /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC print_sysfiles( list : PTR TO mlh , name , num_checks )
-
- DEF sf : PTR TO sysfile
- DEF formatstr[ 100 ] : STRING , lenf[ NUMBERFIELDS ] : ARRAY
- DEF str1[ 20 ] : STRING , str2[ 20 ] : STRING , str3[ 20 ] : STRING
-
- IF ( ( sf := list.head ) BUT sf.succ )
-
- lenf[ NAME ] := 12
- lenf[ OPENED ] := 6
- lenf[ LASTUSED ] := 9
- lenf[ VERSION ] := 7
- lenf[ CHNG ] := 4
- lenf[ LASTCHANGE ] := 11
- WHILE sf.succ
- lenf[ NAME ] := Max( lenf[ NAME ] , EstrLen( sf.name ) )
- lenf[ OPENED ] := Max( lenf[ OPENED ] , EstrLen( RealF( str1 , sf.open_count!/(num_checks!) , 2 ) ) )
- lenf[ LASTUSED ] := Max( lenf[ LASTUSED ] , EstrLen( sf.last_used ) )
- lenf[ VERSION ] := Max( lenf[ VERSION ] , EstrLen( StringF( str1 , '\d.\d' , sf.vernum , sf.revnum ) ) )
- lenf[ CHNG ] := Max( lenf[ CHNG ] , EstrLen( StringF( str1 , '\d' , sf.changed ) ) )
- lenf[ LASTCHANGE ] := Max( lenf[ LASTCHANGE ] , EstrLen( sf.last_change ) )
- sf := sf.succ
- ENDWHILE
-
- StringF( formatstr , '%-\d.\ds %\d.\ds %\d.\ds %\d.\ds %\d.\ds %\d.\ds\n' ,
- lenf[ NAME ] , lenf[ NAME ] ,
- lenf[ OPENED ] , lenf[ OPENED ] ,
- lenf[ LASTUSED ] , lenf[ LASTUSED ] ,
- lenf[ VERSION ] , lenf[ VERSION ] ,
- lenf[ CHNG ] , lenf[ CHNG ] ,
- lenf[ LASTCHANGE ] , lenf[ LASTCHANGE ] )
-
- PrintF( '\n\c1;33;40\c' , $9B , $6D )
- PrintF( formatstr , name , 'Opened' , 'Last used' , 'Version' , 'Chng' , 'Last change' )
- PrintF( '\c0;31;40\c' , $9B , $6D )
-
- sf := list.head
- WHILE sf.succ
- PrintF( formatstr ,
- sf.name ,
- RealF( str1 , sf.open_count!/(num_checks!) , 2 ) , sf.last_used ,
- StringF( str2 , '\d.\d' , sf.vernum , sf.revnum ) ,
- StringF( str3 , '\d' , sf.changed ) , sf.last_change )
- sf := sf.succ
- ENDWHILE
-
- ENDIF
-
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////////////////// PROC save_sysfiles /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC save_sysfiles( file , list : PTR TO mlh , type )
-
- DEF sf : PTR TO sysfile , sl[ 200 ] : STRING
-
- sf := list.head
- WHILE sf.succ
- Fputs( file ,
- StringF( sl , '"\s" \d "\s" \d \d \d "\s" \s\n' ,
- sf.name , sf.open_count , sf.last_used ,
- sf.vernum , sf.revnum , sf.changed , sf.last_change ,
- type ) )
- sf := sf.succ
- ENDWHILE
-
- ENDPROC
-